/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec 中等
 * 给你一个整数数组 nums ，请你找出一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。
 * 子数组 是数组中的一个连续部分。
 * 输入：nums = [-2,1,-3,4,-1,2,1,-5,4]
 * 输出：6
 * 解释：连续子数组 [4,-1,2,1] 的和最大，为 6
 * @since 2023-09-06 15:38
 */
public class _053最大子数组和 {
    public static void main(String[] args) {
        int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
        System.out.println(new _053最大子数组和().maxSubArray(nums));
    }

    //动态规划
    public int maxSubArray(int[] nums) {
        int cur = 0, ans = nums[0];
        /*
        记录以 当前数前一个数结尾的最大子数组和
        dp[i] = max(nums[i], dp[i-1] + nums[i])
        dp[i] 表示以nums[i] 结尾的最大子数组和
         */
        for (int num : nums) {
            //加上前面以nums[i-1] 结尾的最大子数组和 或 从自己算起
            cur = Math.max(cur + num, num);
            ans = Math.max(ans, cur);
        }
        return ans;
    }
}
